import os
import shutil
import argparse
from datetime import datetime, timedelta

def copy_first_file_per_minute(input_dir, prefix, suffix, time_format, minute_interval, output_dir):
    # 获取输入目录所有文件
    try:
        all_files = os.listdir(input_dir)
    except FileNotFoundError:
        print(f"错误: 输入目录 '{input_dir}' 不存在")
        return
    except PermissionError:
        print(f"错误: 没有权限访问目录 '{input_dir}'")
        return
    
    # 创建目标目录
    if output_dir:
        os.makedirs(output_dir, exist_ok=True)
    
    # 筛选特定前缀和后缀的文件并提取时间信息
    filtered_files = []
    prefix_len = len(prefix)
    
    for filename in all_files:
        if filename.startswith(prefix) and filename.endswith(suffix):
            # 提取时间戳部分
            time_str = filename[prefix_len :-len(suffix)]
            
            try:
                # 解析时间字符串
                file_time = datetime.strptime(time_str, time_format)
                # 计算时间组 (按分钟间隔分组)
                base_time = file_time.replace(second=0, microsecond=0)
                minutes_group = (file_time.minute // minute_interval) * minute_interval
                group_key = base_time.replace(minute=minutes_group)
                
                filtered_files.append((group_key, file_time, filename))
            except ValueError:
                print(f"警告: 跳过时间格式无效的文件: {filename}")
                continue
    
    # 按时间组分组并找到每组的第一个文件
    selected_files = {}
    for group_key, file_time, filename in filtered_files:
        # 如果该组还没有记录，或者当前文件时间更早
        if group_key not in selected_files or file_time < selected_files[group_key][0]:
            selected_files[group_key] = (file_time, filename)
    
    # 复制选中的文件
    for group_key, (file_time, filename) in selected_files.items():
        src_path = os.path.join(input_dir, filename)
        try:
            if output_dir is None:
                print(f"selected {filename} (time: {file_time.strftime(time_format)}, group: {group_key.strftime(time_format)})")
            else:
                dst_path = os.path.join(output_dir, filename)
                shutil.copy2(src_path, dst_path)
                print(f"cp: {src_path} -> {dst_path} ")
        except Exception as e:
            print(f"cp error! {src_path} -> {dst_path} ({str(e)})")
    
    print(f"\ncompletely! select {len(selected_files)} files to {output_dir}")

def main():
    # 设置参数解析
    parser = argparse.ArgumentParser(
        description='复制每分钟/间隔的第一个文件到指定目录',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    
    parser.add_argument('input', help='输入目录路径')
    parser.add_argument('-f', '--format', default='%Y.%m.%d_%H.%M.%S', 
                        help='文件名中的时间格式')
    parser.add_argument('-p', '--prefix', default= None, 
                        help='文件前缀 (例如 rgb-left- 或 rgb-right-)')
    parser.add_argument('-s', '--suffix', default='.yuv', 
                        help='文件后缀 (例如 .yuv)')
    parser.add_argument('-m', '--minute_interval', type=int, default=1,
                        help='时间分组间隔(分钟)')
    parser.add_argument('-o', '--output', default=None,
                        help='输出目录路径,如果为空则打印挑选结果')
    
    args = parser.parse_args()
    
    # 验证分钟间隔
    if args.minute_interval <= 0 or args.minute_interval > 60:
        print("错误: 分钟间隔必须在 1-60 之间")
        return
    
    # 处理文件
    copy_first_file_per_minute(
        input_dir=args.input,
        prefix=args.prefix,
        suffix=args.suffix,
        time_format=args.format,
        minute_interval=args.minute_interval,
        output_dir=args.output
    )

if __name__ == "__main__":
    main()